<?php

namespace App\Http\Controllers\Api\V1;

use App\Http\Controllers\Controller;
use App\Repository\OrderRepository;
use App\Repository\TokenRepository;
use Dingo\Api\Exception\StoreResourceFailedException;

/**
 * Class OrderController
 * @package App\Http\Controllers\Api\V1
 */
class OrderController extends Controller
{
    public $order;
    /*订单思路*/
    //用户在选择商品后，向api提交包含它所选商品的相关信息。
    //api接受商品信息后，检测订单相关商品的库存量[客户端信息和服务器的信息数据不是实时同步，（选择商品后，订单提交之前 缺货）]。
    //如果有库存，就把订单信息保存到数据库中等同于下单成功，返回客户端消息，告诉客户端可以进行支付。
    //客户端接受“可以支付消息”，调用支付接口，进行支付操作。
    //进行支付，扣款之前再次检测库存量（下单之后允许在一定时间段内进行支付{付款}）。
    //库存量检测通过服务器调用微信的支付接口进行支付。
    //小程序根据服务器返回参数拉去支付
    //【在调用支付和支付成功之间再次检测库存量，可能会在调用之后缺货】，发生的概率很小。可忽略
    //微信会返回一个支付结果，根据微信的返回结果判断是否支付成功。【异步调用】
    //如果微信返回支付成功，对库存量进行对应的扣除，如果微信返回支付失败，返回一个支付失败的结果【返回客户端支付成功与否是微信返回的。】

    /**
     * OrderController constructor.
     */
    public function __construct(OrderRepository $orderRepository)
    {
        $this->order = $orderRepository;
//        $this->middleware('exclusivescope')->only('placeOrder');
    }

    /**
     * 下单接口
     * @return array
     */
    public function placeOrder()
    {
        $data = app('request')->input('products');

        $rules = [
            'product_id' => ['required', 'min:0', 'numeric', 'integer'],
            'count' => ['required', 'min:0', 'numeric', 'integer'],
        ];

        foreach ($data as $item){
            $validator = app('validator')->make($item, $rules);
            if ($validator->fails()){
                throw new StoreResourceFailedException('以下字段输入错误',$validator->errors());
            }
        }

        $data = app('request')->input('products');
        $uid = TokenRepository::getCurrentUid();

        return $this->order->place($uid, $data);
    }
}
